#ifndef __MAIN_GLOBAL_H
#define __MAIN_GLOBAL_H

#include "cmsis_os.h"  // 有 QueueHandle_t 定义
#include "usart.h"
#include "queue.h"
#include <stdio.h>
#include <string.h>
#include "motor.h"
#include "servo.h"

#include "pid_bridge.h"
// #include "cmsis_os2.h"
#include "peripheral_init.h"


//-------------------------队列信号量-----------------------
extern osMessageQueueId_t ControlQueueHandle;
extern osMessageQueueId_t UsartQueueHandle;
extern osSemaphoreId_t UsartReadySemHandle;


//--------------------------电机控制------------------------
typedef struct {
    uint16_t motor;
    uint16_t servo;
} ControlCmd_t;

#define CLAMP(x, low, high)  ((x) < (low) ? (low) : ((x) > (high) ? (high) : (x)))


//--------------------------串口回调------------------------

#define USART_DMA_BUFFER_SIZE  24

typedef struct {
    uint8_t data[8];  // 提取的8字节原始数据
} UsartRaw_t;

typedef enum {
    FRAME_WAIT_HEAD,
    FRAME_RECEIVING
} FrameState;


extern uint8_t rx_dma_buffer[USART_DMA_BUFFER_SIZE];  // 第一个接收缓冲区
extern uint8_t rx_proc_buffer[USART_DMA_BUFFER_SIZE];  // 第二个接收缓冲区


//--------------------------函数定义------------------------
/**
 * @brief UART 空闲中断回调函数
 *        当检测到UART的IDLE中断（表示数据接收暂时停止）时调用，用于处理DMA接收缓冲区中的数据。
 *
 * @param huart 指向UART句柄的指针，用于区分具体的UART实例
 *
 * @note  该函数通常在UART中断服务函数中被调用，用于实现基于DMA的环形缓冲区数据接收与处理
 */
void HAL_UART_IDLECallback(UART_HandleTypeDef *huart);

/**
 * @brief      解析 UART 接收到的数据帧
 * @param[in]  data  指向接收到的数据缓存区
 * @param[in]  len   数据长度（字节数）
 *
 * @note       本函数通过状态机方式解析符合格式的帧数据，帧格式为：
 *             帧头 0xA0 + 8 字节数据 + 帧尾 0xA1，共 10 字节。
 *             解析成功后将有效数据放入消息队列，并释放信号量通知其他任务处理。
 *
 */
void parse_uart_frame(uint8_t *data, uint16_t len);

void emergency_handle(const char *reason);

#endif
